package Servidor;

import java.util.*;

class Skeleton {
	public Skeleton() {	}
	
	private Paquete desempaquetar(Object marshalled) {
		String mensaje_ = (String)marshalled;
		String mensaje ="";
		
		for(int i=1;i<mensaje_.length()-1;i++)
			if(mensaje_.charAt(i)=='$') mensaje+='-';
			else mensaje+=mensaje_.charAt(i);
		
		String tokens[] = mensaje.split("-");
		int caller =  Integer.parseInt(tokens[0]);
		int op = Integer.parseInt(tokens[1]);
		int num_params = Integer.parseInt(tokens[2]);
		
		Object[] data = new Object[num_params];
		
		for(int i=0;i<num_params;i++) {
			data[i] = Integer.parseInt(tokens[i+3]);
		}
		return new Paquete(caller,op,data);
	}
	
	private Object empaquetar(Paquete unmarshalled) {
		String mensaje ="$"+ unmarshalled.getIdCall();
		mensaje+=("$"+unmarshalled.getIdOp());
		
		Object data[] = unmarshalled.getData();
		mensaje+=("$"+data.length);
		
		for(int i=0;i<data.length;i++)
			mensaje+=("$"+(Integer)data[i]);
		return (Object)mensaje;
	}
	
	public Object despachar(Object marshalled) {
		//unmarshalling
		Paquete remoto = desempaquetar(marshalled);
		//ejecutamos
		int hdata[] = new int[remoto.getData().length];
		
		for(int i=0;i<remoto.getData().length;i++)
			hdata[i] = ((Integer)remoto.getData()[i]).intValue();
	 	
		Object[] rdata = new Object[1];
		Server server = new Server();
		server.procesar(remoto.getIdOp(),hdata);
		rdata[0] = server.getResultado();
		Paquete respuesta = new Paquete(remoto.getIdCall(),remoto.getIdOp(),rdata);

		//marshalling
	 	Object resp = empaquetar(respuesta);
		//enviamos la respuesta
		return resp;
	}
	
	//Funcion de prueba de la clase
	public static void main(String args[]) {
		Object entrada = new String("$1$1$2$2123$2123$");
		Skeleton skeleton = new Skeleton();
		Object respuesta = skeleton.despachar(entrada);
		System.out.println((String)respuesta);
	}
}
